水無瀬の部屋 > Programming > sample > tools > code > hashdll.cpp |
---|
1: //*********************************************************
2: // プロジェクト:
3: // ファイル名: hashdll.cpp
4: //*********************************************************
5: #include <misc/ccslock.h>
6:
7:
8: //---------------------------------------------------------
9: // 公開関数 の 宣言
10: //---------------------------------------------------------
11: #ifdef __cplusplus
12: extern "C" {
13: #endif
14:
15:
16: HANDLE WINAPI CreateAlgorithm( void );
17: DWORD WINAPI InitAlgorithm( HANDLE hAlgorithm );
18: DWORD WINAPI DestroyAlgorithm( HANDLE hAlgorithm );
19: DWORD WINAPI AddData( HANDLE hAlgorithm, const void *data, int length );
20: int WINAPI GetHashLength( HANDLE hAlgorithm );
21: DWORD WINAPI GetHash( HANDLE hAlgorithm, void *buffer, int bufsize );
22: int WINAPI GetHashTextLength( HANDLE hAlgorithm );
23: DWORD WINAPI GetHashText( HANDLE hAlgorithm, void *buffer, int bufsize );
24:
25:
26: #ifdef __cplusplus
27: } // extern "C"
28: #endif
29:
30:
31: //---------------------------------------------------------
32: // マクロ の 定義
33: //---------------------------------------------------------
34: //
35: #define MAGIC_STRING_LENGTH ( sizeof( MAGIC_STRING ) )
36:
37: //
38: #define REPLACE_HASH_NAME( macro ) macro
39: #define MAKE_HASH_MACRO( suffix ) REPLACE_HASH_NAME( ALGORITHM_PREFIX ) ## suffix
40: #define HASH_CTX MAKE_HASH_MACRO( _CTX )
41: #define HASH_HASHSIZE MAKE_HASH_MACRO( _HASHSIZE )
42: #define HASH_HASHTEXTSIZE MAKE_HASH_MACRO( _HASHTEXTSIZE )
43: #define HASH_CREATEALGORITHM MAKE_HASH_MACRO( _CreateAlgorithm )
44: #define HASH_DESTROYALGORITHM( context ) MAKE_HASH_MACRO( _DestroyAlgorithm( context ) )
45: #define HASH_INITDATA( context ) MAKE_HASH_MACRO( _InitData( context ) )
46: #define HASH_ADDDATA( context, data, length ) MAKE_HASH_MACRO( _AddData( context, data, length ) )
47: #define HASH_GETHASH( context, buffer, bufsize ) MAKE_HASH_MACRO( _GetHash( context, buffer, bufsize ) )
48: #define HASH_GETHASHTEXT( context, buffer, bufsize ) MAKE_HASH_MACRO( _GetHashText( context, buffer, bufsize ) )
49:
50: //
51: #define DLL_NOERROR ( 0x00000000 ) // 関数は正常に終了しました。
52: #define DLL_PARAMERROR ( 0x00000001 ) // 指定された引数が不正です。
53: #define DLL_SYSTEMERROR ( 0x00000100 ) // 関数内部でエラーが発生しました。
54: #define HASH_INVALIDHASHSIZE ( 0 )
55: #define HASH_INVALIDHASHTEXTSIZE ( 0 )
56:
57:
58: //---------------------------------------------------------
59: // 構造体 の 宣言
60: //---------------------------------------------------------
61: typedef struct DLL_CTX_tag
62: {
63: const char *magic;
64: HASH_CTX *context;
65: CRITICAL_SECTION cs;
66: } DLL_CTX;
67:
68:
69: //---------------------------------------------------------
70: // ファイルスコープ関数 の 宣言
71: //---------------------------------------------------------
72: static bool WINAPI IsValidAlgorithm( HANDLE hAlgorithm );
73:
74:
75: //*********************************************************
76: // CreateAlgorithm
77: //*********************************************************
78: HANDLE // アルゴリズムへのハンドル
79: WINAPI
80: CreateAlgorithm
81: (
82: void
83: )
84: {
85: DLL_CTX *context = (DLL_CTX *)malloc( sizeof( *context ) );
86: if ( context )
87: {
88: context->context = HASH_CREATEALGORITHM();
89: if ( context->context )
90: {
91: InitializeCriticalSection( &context->cs );
92: context->magic = MAGIC_STRING;
93: if ( DLL_NOERROR == InitAlgorithm( context ) )
94: {
95: return context;
96: }
97: DeleteCriticalSection( &context->cs );
98: HASH_DESTROYALGORITHM( context->context );
99: }
100: free( context );
101: }
102: return null;
103: }//CreateAlgorithm
104:
105: //*********************************************************
106: // DestroyAlgorithm
107: //*********************************************************
108: DWORD // エラー番号
109: WINAPI
110: DestroyAlgorithm
111: (
112: HANDLE hAlgorithm // アルゴリズムへのハンドル
113: )
114: {
115: // 引数の検査
116: DLL_CTX *context = static_cast<DLL_CTX *>( hAlgorithm );
117: if ( !IsValidAlgorithm( context ) ) { return DLL_PARAMERROR; }
118:
119: HASH_DESTROYALGORITHM( context->context );
120: DeleteCriticalSection( &context->cs );
121: memset( context, 0xCC, sizeof( *context ) );
122: free( context );
123:
124: return DLL_NOERROR;
125: }//DestroyAlgorithm
126:
127: //*********************************************************
128: // InitAlgorithm
129: //*********************************************************
130: DWORD // エラー番号
131: WINAPI
132: InitAlgorithm
133: (
134: HANDLE hAlgorithm // アルゴリズムへのハンドル
135: )
136: {
137: // 引数の検査
138: DLL_CTX *context = static_cast<DLL_CTX *>( hAlgorithm );
139: if ( !IsValidAlgorithm( context ) ) { return DLL_PARAMERROR; }
140:
141: //
142: {
143: CLockCriticalSection Lock( &context->cs );
144: if ( !HASH_INITDATA( context->context ) )
145: {
146: return DLL_SYSTEMERROR;
147: }
148: }
149:
150: return DLL_NOERROR;
151: }//InitAlgorithm
152:
153: //*********************************************************
154: // InputData
155: //*********************************************************
156: DWORD // エラー番号
157: WINAPI
158: InputData
159: (
160: HANDLE hAlgorithm, // アルゴリズムへのハンドル
161: const void *data, // 入力するデータ
162: int length // data の バイト数
163: )
164: {
165: // 引数の検査
166: DLL_CTX *context = static_cast<DLL_CTX *>( hAlgorithm );
167: if ( length <= 0 ) { return DLL_PARAMERROR; }
168: if ( !data || IsBadReadPtr( data, length ) ) { return DLL_PARAMERROR; }
169: if ( !IsValidAlgorithm( context ) ) { return DLL_PARAMERROR; }
170:
171: //
172: {
173: CLockCriticalSection Lock( &context->cs );
174: if ( !HASH_ADDDATA( context->context, data, length ) )
175: {
176: return DLL_SYSTEMERROR;
177: }
178: }
179:
180: return DLL_NOERROR;
181: }//InputData
182:
183: //*********************************************************
184: // GetHashLength
185: //*********************************************************
186: int // バイト数
187: WINAPI
188: GetHashLength
189: (
190: HANDLE hAlgorithm // アルゴリズムへのハンドル
191: )
192: {
193: // 引数の検査
194: DLL_CTX *context = static_cast<DLL_CTX *>( hAlgorithm );
195: if ( !IsValidAlgorithm( context ) ) { return HASH_INVALIDHASHSIZE; }
196:
197: return HASH_HASHSIZE;
198: }//GetHashLength
199:
200: //*********************************************************
201: // GetHash
202: //*********************************************************
203: DWORD // エラー番号
204: WINAPI
205: GetHash
206: (
207: HANDLE hAlgorithm, // アルゴリズムへのハンドル
208: void *buffer, // ハッシュを受け取るバッファ
209: int bufsize // buffer の バイト数
210: )
211: {
212: // 引数の検査
213: DLL_CTX *context = static_cast<DLL_CTX *>( hAlgorithm );
214: if ( bufsize <= 0 ) { return DLL_PARAMERROR; }
215: if ( !buffer || IsBadWritePtr( buffer, bufsize ) ) { return DLL_PARAMERROR; }
216: if ( !IsValidAlgorithm( context ) ) { return DLL_PARAMERROR; }
217:
218: //
219: {
220: CLockCriticalSection Lock( &context->cs );
221: if ( !HASH_GETHASH( context->context, buffer, bufsize ) )
222: {
223: return DLL_SYSTEMERROR;
224: }
225: }
226:
227: return DLL_NOERROR;
228: }//GetHash
229:
230: //*********************************************************
231: // GetHashTextLength
232: //*********************************************************
233: int // バイト数
234: WINAPI
235: GetHashTextLength
236: (
237: HANDLE hAlgorithm // アルゴリズムへのハンドル
238: )
239: {
240: // 引数の検査
241: DLL_CTX *context = static_cast<DLL_CTX *>( hAlgorithm );
242: if ( !IsValidAlgorithm( context ) ) { return HASH_INVALIDHASHTEXTSIZE; }
243:
244: return HASH_HASHTEXTSIZE;
245: }//GetHashTextLength
246:
247: //*********************************************************
248: // GetHashText
249: //*********************************************************
250: DWORD // エラー番号
251: WINAPI
252: GetHashText
253: (
254: HANDLE hAlgorithm, // アルゴリズムへのハンドル
255: char *buffer, // 文字列を受け取るバッファ
256: int bufsize // buffer の バイト数
257: )
258: {
259: // 引数の検査
260: DLL_CTX *context = static_cast<DLL_CTX *>( hAlgorithm );
261: if ( bufsize <= 0 ) { return DLL_PARAMERROR; }
262: if ( !buffer || IsBadWritePtr( buffer, bufsize ) ) { return DLL_PARAMERROR; }
263: if ( !IsValidAlgorithm( context ) ) { return DLL_PARAMERROR; }
264:
265: //
266: {
267: CLockCriticalSection Lock( &context->cs );
268: if ( !HASH_GETHASHTEXT( context->context, buffer, bufsize ) )
269: {
270: return DLL_SYSTEMERROR;
271: }
272: }
273:
274: return DLL_NOERROR;
275: }//GetHashText
276:
277:
278: //******************************************************************************************************************
279: // private
280: //******************************************************************************************************************
281: //*********************************************************
282: // IsValidAlgorithm
283: //*********************************************************
284: static
285: bool
286: WINAPI
287: IsValidAlgorithm
288: (
289: HANDLE hAlgorithm // アルゴリズムへのハンドル
290: )
291: {
292: DLL_CTX *context = static_cast<DLL_CTX *>( hAlgorithm );
293:
294: VALID_TEST( context );
295: VALID_TEST( ! IsBadReadPtr( context, sizeof( *context ) ) );
296: VALID_TEST( ! IsBadWritePtr( context, sizeof( *context ) ) );
297: VALID_TEST( context->magic );
298: VALID_TEST( ! IsBadStringPtr( context->magic, MAGIC_STRING_LENGTH ) );
299: VALID_TEST( streql( context->magic, MAGIC_STRING ) );
300: VALID_TEST( context->context );
301:
302: return true;
303: }//IsValidAlgorithm
304:
305:
306: //** end **
307:
参照:
main.cpp, main.cpp, main.cpp, main.cpp, main.cpp
水無瀬の部屋 > sample > tools > code > hashdll.cpp |
---|
このページは cpp2web が出力しました。
水無瀬 優 postmaster@katsura-kotonoha.sakura.ne.jp
http://katsura-kotonoha.sakura.ne.jp/prog/code/tools/code/hashdll_cpp.shtml